package com.atguigu.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.*;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * @版本： V5.1.0
 * @版权： Copyright @ 2025 广东广昱信息科技有限公司版权所有
 * @作者： 广东广昱信息科技有限公司
 * @日期： 2025-06-15 21:10
 *
 *  1.包扫描注解配置
 *  2.引用外部的配置文件
 *  3.声明第三方依赖方的bean组件
 *
 *  步骤1:添加@Configuration 代表我们是配置类
 *  步骤2:实现上面的三个功能注解
 */
@ComponentScan("com.atguigu.Ioc_01")
@PropertySource(value = "classpath:jdbc.properties")
@Configuration
public class JavaConfiguration {

    @Value("${atguigu.url}")
    private String url;
    @Value("${atguigu.driver}")
    private String driver;
    @Value("${atguigu.username}")
    private String username;
    @Value("${atguigu.password}")
    private String password;


    /**
     * <bean -》一个方法
     *
     * 方法的返回值类型 == bean组件的类型或者其他的接口和父类
     * 方法的名字 == bean组件的id
     *
     *
     * 方法体可以自定义实现过程即可
     * 最重要一步：@Bean  会真正让配置类的方法创建的组件存储到ioc容器中!!
     * >
     *
     *问题1：beanName的问题
     *  默认：方法名
     *  指定： name/value属性起名字,覆盖方法名
     *
     * 问题2：周期方法如何指定
     *       原有注解方案 PostConstruct/PreDestroy
     *       bean属性指定： initMethod/destroyMethod指定
     *
     * 问题3：作用域
     *      和以前还是一样@Scope注解,默认是单例
     *
     *问题4：如何引用其他的ioc组件
     *      直接调用对方的bean方法即可
     *      直接形参变量进行引入，要求必须有对应的组件，如果有多个，形参名称要和bean的id一致
     *
     * @return
     */
    @Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
    @Bean(name = "ergouzi")
    public DruidDataSource dataSource1(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
    @Bean(name = "lvdandan")
    public DruidDataSource dataSource2(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //需要DataSource  需要ioc容器的其他组件
        //方案1：如果其他组件也是@Bean方法，可以直接调用|从ioc容器获取组件
        jdbcTemplate.setDataSource(dataSource1());
        return jdbcTemplate;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DruidDataSource lvdandan){
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        //需要DataSource  需要ioc容器的其他组件
        //方案2：形参列表声明想要的组件类型，可以是一个也可以是多个！ioc容器也会注入
        //如果没有：形参变量注入，要求必须有对应的类型的组件，如果没有抛异常！
        //如果有多个：可以使用形参名称等同于对应的beanid标识即可
        jdbcTemplate.setDataSource(lvdandan);
        return jdbcTemplate;
    }
}
